package mutli_cache

// LocalCache 本地缓存数据源
type LocalCache interface {
	Get(key string, obj interface{}) (*Entry, bool, error) // 返回真实数据
	Set(key string, e *Entry) error                        // 本机缓存需要设置过期时间
	Del(key string) error                                  // 删除指定Key对应数据
	Close()                                                // 关闭本机缓存
}

// OutCache 缓存数据源,如Redis
type OutCache interface {
	Get(key string, obj interface{}) (*Entry, bool, error) // 返回真实数据
	Set(key string, e *Entry) error                        // 外部缓存需要设置过期时间
	Del(key string) error                                  // 删除指定Key对应数据
	Close()                                                // 关闭缓存数据源
}

// PubSub 缓存数据源发布订阅接口
type PubSub interface {
	Subscribe(data chan<- *ChannelMeta) error
	Publish(cacheID, key string, action int8, data *Entry) error
}

// LoadDataSourceFunc 外部数据源(mysql),兜底策略
type LoadDataSourceFunc func() (interface{}, error)

// Entry expire is UnixNano
const (
	SetPublishType int8 = iota // 存入数据类型
	DelPublishType             // 删除数据类型
)

type ChannelMeta struct {
	Key     string `json:"key"`    // 数据对应的key
	CacheID string `json:"gid"`    // 数据存入的缓存GID
	Action  int8   `json:"action"` // 数据执行类型
	Data    *Entry `json:"data"`   // 对应数据
}
